package com.chenjt.jvm.second.four_classLife;

/**
 * 注释：
 *
 * 关于类的被动使用，即不会进行类的初始化操作，即不会调用<clinit>方法
 *
 *
 * 1.当访问一个静态字段时，只有真正声明这个字段的类才会被初始化。
 *     > 当通过子类引用父类的静态变量，不会导致子类初始化
 * 2.通过数组定义类引用，不会触发此类的初始化
 *
 * @author chenjt
 * @date 2025/7/2 10:10
 */
public class PassiveUse1 {


    public static void main(String[] args) {
//        test1();
        test2();
    }
    public static void test1(){
        /**
         * 输出：
         *   Parent的初始化过程
         *   1
         * 1.当访问一个静态字段时，只有真正声明这个字段的类才会被初始化。
         *     > 当通过子类引用父类的静态变量，不会导致子类初始化
         *
         */
        System.out.println(Child.num);
    }


    public static void test2(){
        /**
         * 2.通过数组定义类引用，不会触发此类的初始化
         */
        // 只是声明一个数组，不会引起Parent类的初始化
        Parent[] parents = new Parent[10];
        // class [Lcom.chenjt.jvm.second.four_classLife.Parent;
        System.out.println(parents.getClass());
        // class java.lang.Object
        System.out.println(parents.getClass().getSuperclass());

        /**
         * 输出：
         *  Parent的初始化过程
         *
         * 通过对数组中对应的索引创建一个对象，才会触发类的<clinit>方法
         */
        parents[0] = new Parent();
        /**
         * 这里不会再触发一次Parent这个类的<clinit>方法
         * <clinit>方法只会执行一次
         */
        parents[1] = new Parent();
    }


}


class Parent{
    static{
        System.out.println("Parent的初始化过程");
    }
    public static int num = 1;
}

class Child extends Parent{
    static{
        System.out.println("Child的初始化过程");
    }
}
